package com.gt.library.utils

import android.text.format.Time
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*

/**
 * Description:    日期
 * Author:         liuteng
 * CreateDate:     2022年4月28日
 * UpdateRemark:   更新说明
 */
object DateUtil {
    private var sf: SimpleDateFormat? = null
    private var sdf: SimpleDateFormat? = null

    /**
     * 获取系统时间 格式为："yyyy/MM/dd "
     */
    val currentDate: String
        get() {
            val d = Date()
            sf = SimpleDateFormat("yyyy年MM月dd日")
            return sf!!.format(d)
        }

    /**
     * 获取系统时间 格式为："yyyy/MM/dd HH:mm:ss"
     */
    val currentYYMMDDHHMMSS: String
        get() {
            val d = Date()
            sf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
            return sf!!.format(d)
        }

    /**
     * 获取系统时间 格式为："yyyy/MM/dd "
     */
    val currentYYMMdd: String
        get() {
            val d = Date()
            sf = SimpleDateFormat("yyyy-MM-dd")
            return sf!!.format(d)
        }

    /**
     * 获取系统时间 格式为："yyyy/MM/dd "
     */
    val currentYYMM: String
        get() {
            val d = Date()
            sf = SimpleDateFormat("yyyy-MM")
            return sf!!.format(d)
        }

    /**
     * 获取系统时间 格式为："yyyy "
     */
    val currentYear: String
        get() {
            val d = Date()
            sf = SimpleDateFormat("yyyy")
            return sf!!.format(d)
        }

    /**
     * 获取系统时间 格式为："MM"
     */
    val currentMonth: String
        get() {
            val d = Date()
            sf = SimpleDateFormat("MM")
            return sf!!.format(d)
        }

    /**
     * 获取系统时间 格式为："dd"
     */
    val currentDay: String
        get() {
            val d = Date()
            sf = SimpleDateFormat("dd")
            return sf!!.format(d)
        }

    /**
     * 获取系统时间 格式为：HH:mm:ss
     */
    val currentTime: String
        get() {
            val d = Date()
            sf = SimpleDateFormat("HH:mm:ss")
            return sf!!.format(d)
        }

    /**
     * 获取当前时间戳
     * @return
     */
    val currentTimeLong: Long
        get() = System.currentTimeMillis()

    /**
     * 时间戳转换成字符窜
     */
    fun getDateToString(time: Long): String {
        val d = Date(time * 1000)
        sf = SimpleDateFormat("yyyy年MM月dd日")
        return sf!!.format(d)
    }

    /**
     * 时间戳中获取年
     */
    fun getYearFromTime(time: Long): String {
        val d = Date(time * 1000)
        sf = SimpleDateFormat("yyyy")
        return sf!!.format(d)
    }

    /**
     * 时间戳中获取月
     */
    fun getMonthFromTime(time: Long): String {
        val d = Date(time * 1000)
        sf = SimpleDateFormat("MM")
        return sf!!.format(d)
    }

    /**
     * 时间戳中获取日
     */
    fun getDayFromTime(time: Long): String {
        val d = Date(time * 1000)
        sf = SimpleDateFormat("dd")
        return sf!!.format(d)
    }

    /**
     * 将字符串转为时间戳
     */
    fun getStringToDate(time: String?): Long {
        sdf = SimpleDateFormat("yyyy年MM月dd日")
        var date = Date()
        try {
            date = sdf!!.parse(time)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        return date.time
    }

    /**
     * 格式化时间
     */
    fun getDateTimeString(date: String?): String {
        sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        return sdf!!.format(date)
    }

    /**
     * 格式化时间: yyyyMMdd ---->   yyyy-MM-dd
     */
    fun getDateString(date: String?): String {
        val mdate = SimpleDateFormat("yyyyMMdd").parse(date)
        sdf = SimpleDateFormat("yyyy-MM-dd")
        return sdf!!.format(mdate)
    }

    /**
     * 格式化时间: yyyy年MM月dd日 ---->   yyyy年MM月dd日
     */
    fun getDateStringSame(date: String?): String {
        val mdate = SimpleDateFormat("yyyy年MM月dd日").parse(date)
        sdf = SimpleDateFormat("yyyy年MM月dd日")
        return sdf!!.format(mdate)
    }

    /**
     * 判断当前系统时间是否在特定时间的段内
     * @param beginHour
     * 开始的小时，例如5
     * @param beginMin
     * 开始小时的分钟数，例如00
     * @param endHour
     * 结束小时，例如 8
     * @param endMin
     * 结束小时的分钟数，例如00
     * @return true表示在范围内，否则false
     */
    fun isCurrentInTimeScope(beginHour: Int, beginMin: Int, endHour: Int, endMin: Int): Boolean {
        var result = false // 结果
        val aDayInMillis = (1000 * 60 * 60 * 24).toLong() // 一天的全部毫秒数
        val currentTimeMillis = System.currentTimeMillis() // 当前时间
        val now = Time() // 注意这里导入的时候选择android.text.format.Time类,而不是java.sql.Time类
        now.set(currentTimeMillis)
        val startTime = Time()
        startTime.set(currentTimeMillis)
        startTime.hour = beginHour
        startTime.minute = beginMin
        val endTime = Time()
        endTime.set(currentTimeMillis)
        endTime.hour = endHour
        endTime.minute = endMin
        if (!startTime.before(endTime)) {
            // 跨天的特殊情况（比如22:00-8:00）
            startTime.set(startTime.toMillis(true) - aDayInMillis)
            result = !now.before(startTime) && !now.after(endTime) // startTime <= now <= endTime
            val startTimeInThisDay = Time()
            startTimeInThisDay.set(startTime.toMillis(true) + aDayInMillis)
            if (!now.before(startTimeInThisDay)) {
                result = true
            }
        } else {
            // 普通情况(比如 8:00 - 14:00)
            result = !now.before(startTime) && !now.after(endTime) // startTime <= now <= endTime
        }
        return result
    }

    /**
     * 计算两个日期相差多少天(by date)
     */
    fun daysBetween(startDate: Date?, endDate: Date?): Int {
        val cal = Calendar.getInstance()
        cal.time = startDate
        val time1 = cal.timeInMillis
        cal.time = endDate
        val time2 = cal.timeInMillis
        val between_days = (time2 - time1) / (1000 * 3600 * 24)
        return between_days.toString().toInt()
    }

    /**
     * JAVA计算两个日期相差多少天(by Date String with format "yyyy-MM-dd")
     * @author zhengkai.blog.csdn.net
     */
    fun daysBetween(startDate: String?, endDate: String?): Int {
        val format = SimpleDateFormat("yyyy-MM-dd")
        val date1 = format.parse(startDate)
        val date2 = format.parse(endDate)
        return ((date1.time - date2.time) / (1000 * 3600 * 24)).toInt()
    }
}